package org.dei.perla.sys.device.channel.concrete.socket;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import org.dei.perla.sys.configuration.ConfigurationParameter;
import org.dei.perla.sys.device.channel.frame.address.concrete.SocketFrameAddress;

/**
 * Questa classe contiene i parametri di configurazione per un SocketChannel
 *
 */
public class SocketChannelConfiguration {

	/**
	 * Costanti di configurazione del parser dell'XML di configurazione
	 */
	private final static String PARAM_BIND_IP_ADDRESS 	= "socket-bind-ip";
	private final static String PARAM_BIND_PORT 		= "socket-bind-port";

	/**
	 * Ip su cui accettare connessioni (per socket di tipo server) 
	 * o a cui connettersi (per socket di tipo client)
	 */
	SocketFrameAddress pParamRemoteAddress;

	/**
	 * Inizializza la configurazione di un SocketChannel
	 * @param parParams Parametri di configurazione
	 */
	public SocketChannelConfiguration(ArrayList<ConfigurationParameter> parParams) {
		
		String tParamBindIp = "";
		int tParamBindPort	= 0;
		
		// Leggi i parametri di configurazione
		for (int i = 0; i < parParams.size(); i++) {
			
			ConfigurationParameter tCurrParam = parParams.get(i);
			
			if ( tCurrParam.getName().equalsIgnoreCase(SocketChannelConfiguration.PARAM_BIND_IP_ADDRESS)) {
				tParamBindIp = tCurrParam.getValue();
			} else if ( tCurrParam.getName().equalsIgnoreCase(SocketChannelConfiguration.PARAM_BIND_PORT)) {
				tParamBindPort = new Integer(tCurrParam.getValue()).intValue();
			} 
		
		}
		
		try {
			this.pParamRemoteAddress = new SocketFrameAddress(new InetSocketAddress(InetAddress.getByName(tParamBindIp), tParamBindPort));
		} catch (UnknownHostException e) {
			/**
			 * @todo eccezione da gestire
			 */
			e.printStackTrace();
		}

	}
	
	/**
	 * Inizializza la configurazione di un SocketChannel
	 * @param parBindIp 
	 * @param parBindPort 
	 */
	public SocketChannelConfiguration(String parBindIp, int parBindPort) {
		super();
		try {
			this.pParamRemoteAddress = new SocketFrameAddress(new InetSocketAddress(InetAddress.getByName(parBindIp), parBindPort));
		} catch (UnknownHostException e) {
			/**
			 * @todo eccezione da gestire
			 */
			e.printStackTrace();
		}
	}

	/**
	 * Restituisci l'indirizzo a cui connettere il socket channel
	 * @return
	 */
	public SocketFrameAddress getRemoteAddress() {
		return this.pParamRemoteAddress;
	}

}
